home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1999 / MacHack 1999.toast / The Hacks / MACtive Desktop / Source / Sources / PSdemo5.c < prev    next >
Encoding:
Text File  |  1999-06-25  |  6.0 KB  |  222 lines  |  [TEXT/CWIE]

  1. /* File "PSdemo4.c" - Phase Shift plugin module, sample plugin implementation */
  2.  
  3. //#include "PSmain.h"
  4. #include <Types.h>
  5. #include <QuickDraw.h>
  6. #include <LowMem.h>
  7.  
  8. #include "LayerManager.h"
  9.  
  10. OSErr InitPSModule(long *ticks);
  11. OSErr DrawPSModule(GrafPtr deskPort, Boolean idle);
  12. void ClosePSModule(void);
  13.  
  14. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  15. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  16. /* Preprocessor Defines */
  17.  
  18. #define kFraction        8
  19. #define kPieces            9
  20.  
  21. #define qWidth()    ((*GetGrayRgn())->rgnBBox.right - (*GetGrayRgn())->rgnBBox.left)
  22. #define qHeight()    ((*GetGrayRgn())->rgnBBox.bottom - (*GetGrayRgn())->rgnBBox.top)
  23.  
  24. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  25. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  26. /* Global/Static Data */
  27.  
  28. static GWorldPtr    gw = nil;
  29. static PixMapHandle    pm = nil;
  30.  
  31. #define        JGNEFilter                0x0000029A
  32. UniversalProcPtr    GNEOriginal;
  33. short    myJGNEFilter (register EventRecord *theEvent:__A1, register short eventresult:__D0);
  34.  
  35. typedef    short    (*GNEProcPtr) (register EventRecord *theEvent:__A1, register short eventresult:__D0);
  36. #define callGNE(userRoutine, theEvent, eventresult)        \
  37.             (*(GNEProcPtr)(userRoutine))((theEvent), (eventresult))
  38.  
  39.  
  40.  
  41. static Boolean GetAppProcess(OSType pCreator, ProcessSerialNumber *pProcess, FSSpec *pProcFile)
  42. {
  43.     ProcessInfoRec    sProcInfo;
  44.     Boolean            sFound = false;
  45.  
  46.     if (true /* gsHasProcessManager */) {
  47.         pProcess->highLongOfPSN = 0;
  48.         pProcess->lowLongOfPSN = kNoProcess;
  49.         sProcInfo.processInfoLength = sizeof(ProcessInfoRec);
  50.         sProcInfo.processName = nil;
  51.         sProcInfo.processAppSpec = pProcFile;
  52.         while ((!sFound) && (GetNextProcess(pProcess) == noErr)) {
  53.             if (GetProcessInformation(pProcess, &sProcInfo) == noErr) {
  54.                 if (sProcInfo.processSignature == pCreator) {
  55.                     if ((sProcInfo.processType == 'APPL') || 
  56.                         (sProcInfo.processType == 'appe') || 
  57.                         (sProcInfo.processType == 'appc'))
  58.                         sFound = true;
  59.                 }
  60.             }
  61.         }
  62.         if (!sFound) {
  63.             pProcess->highLongOfPSN = 0;
  64.             pProcess->lowLongOfPSN = kNoProcess;
  65.         }
  66.     }
  67.     return(sFound);
  68. }
  69.  
  70. static WindowPtr    browserWin = nil;
  71.  
  72. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  73. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  74.  
  75. OSErr InitPSModule(long *ticks) {
  76.     OSErr        error = noErr;
  77.     Rect        bounds, temp;
  78.     UInt32        i;
  79.     Boolean        foundBrowser = false;
  80.  
  81.     *ticks = 10;
  82.     
  83.     FSSpec    browserFSSpec;
  84.     ProcessSerialNumber    browserPSN;
  85.     if (!GetAppProcess('MSIE', &browserPSN, &browserFSSpec)) {
  86.         if (GetAppProcess('MOSS', &browserPSN, &browserFSSpec)) foundBrowser = true;
  87.     }
  88.     else
  89.         foundBrowser = true;
  90.     
  91.     if (foundBrowser) {
  92.         WindowPtr    fWin = GetFrontWindowFromProcess(&browserPSN);
  93.         if (fWin) {
  94.             browserWin = fWin;
  95.  
  96.             // install a jGNE
  97. //            GNEOriginal = *((UniversalProcPtr*)JGNEFilter);
  98. //            *((UniversalProcPtr*)JGNEFilter) = (UniversalProcPtr)myJGNEFilter;
  99.             
  100. /*
  101.             // setup a REALLY BIG region...
  102.             Rect        bigRect = { -32000, -32000, 32000, 32000 };
  103.             RgnHandle    bigRgn = NewRgn();
  104.             RectRgn(bigRgn, &bigRect);
  105.             
  106.             browserWin->visRgn = bigRgn;
  107.             browserWin->clipRgn = bigRgn;
  108. */
  109.             
  110.             Rect     gwRect = (*((CGrafPtr)browserWin)->portPixMap)->bounds;    // (*GetMainDevice())->gdRect;
  111.             
  112.             if ((error = NewGWorld(&gw, (*((CGrafPtr)browserWin)->portPixMap)->pixelSize, 
  113.                                    &gwRect, nil, GetMainDevice(), 
  114.                                     noNewDevice)) != noErr) return(error);
  115.             LockPixels(pm = GetGWorldPixMap(gw));
  116.         
  117.             CopyBits(&fWin->portBits, (BitMap *) *pm, &browserWin->portRect, 
  118.                      &browserWin->portRect, srcCopy, nil);
  119.  
  120.             RGBColor     foo = {2000, 2000, 2000};
  121.             GrafPtr    oldPort;
  122.             GetPort(&oldPort);
  123.             SetPort(browserWin);
  124.             SetPortPix(pm);
  125.             RGBBackColor(&foo);
  126.             EraseRect(&browserWin->portRect);
  127.             SetPort(oldPort);
  128.         }
  129.     }
  130.     return(noErr);
  131.     }
  132.     
  133. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  134. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  135.  
  136. OSErr DrawPSModule(GrafPtr grafport, Boolean idle) 
  137. {
  138.     if (browserWin) {
  139.         GWorldPtr    saveGW;
  140.         GDHandle    saveGD;
  141.         Rect        srcRect = browserWin->portRect, destRect = browserWin->portRect;
  142.  
  143.         OffsetRect(&destRect, -destRect.left, -destRect.top);
  144.  
  145.         SetRectRgn(browserWin->visRgn, -32000, -32000, 32000, 32000);
  146.         SetRectRgn(browserWin->clipRgn, -32000, -32000, 32000, 32000);
  147.         SetRectRgn(((WindowPeek)browserWin)->updateRgn, -32000, -32000, 32000, 32000);
  148.  
  149.         OffsetRect(&destRect, 0, GetMBarHeight());
  150.         CopyBits((BitMap *) *pm, &grafport->portBits, &srcRect, &destRect, srcCopy, nil);
  151.  
  152.  
  153.         GrafPtr    oldPort;
  154.         GetPort(&oldPort);
  155.         SetPort(browserWin);
  156.         InvalRect(&browserWin->portRect);
  157.         SetPort(oldPort);
  158.         
  159.     }
  160.     
  161.     return(noErr);
  162. }
  163.     
  164. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  165. /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
  166.  
  167. void ClosePSModule()
  168. {
  169. //    *((UniversalProcPtr*)JGNEFilter) = (UniversalProcPtr)GNEOriginal;
  170. }
  171.  
  172.  
  173. short    myJGNEFilter (register EventRecord *theEvent:__A1, register short eventresult:__D0)
  174. {
  175.     static    Boolean    inJGNE = false;    // used to track reentrancy, just in case
  176.     short        result = eventresult;
  177.     EventRecord    *e = theEvent;
  178.  
  179.     // let's check to see if we're being reentered!
  180.     if (inJGNE)    goto bail;
  181.     inJGNE = true;    // we are now...
  182.     
  183.     if (GNEOriginal)    // just in case...
  184.         result = callGNE(GNEOriginal, e, result);
  185.     
  186.     switch ( theEvent->what ) {
  187.         case mouseDown:
  188.             WindowPtr    whichWindow;
  189.             short        whichPart;
  190.  
  191.             whichPart = FindWindow ( theEvent->where, &whichWindow );
  192.             switch ( whichPart ) {
  193.             }
  194.         break;
  195.             
  196.         case keyDown:
  197.         case autoKey:
  198.         break;
  199.  
  200.         case updateEvt:
  201.             WindowPtr    curWin = (WindowPtr) theEvent->message;
  202.             if (curWin == browserWin) {
  203.                 SetRectRgn(browserWin->visRgn, -32000, -32000, 32000, 32000);
  204.                 SetRectRgn(browserWin->clipRgn, -32000, -32000, 32000, 32000);
  205.             }
  206.         break;
  207.  
  208.         case activateEvt:
  209.         break;
  210.  
  211.         case nullEvent:
  212.         default:
  213.             break;
  214.     }
  215.  
  216. safeExit:    
  217.     inJGNE = false;    // not any more, we're on the way out...
  218.  
  219. bail:            
  220.     return(result);
  221. }
  222.